package ar.uba.is2.sc.comm;

import java.util.Collection;

import org.apache.log4j.Logger;

import ar.uba.is2.common.mensaje.Componente;
import ar.uba.is2.common.mensaje.Mensaje;
import ar.uba.is2.common.mensaje.Receptor;
import ar.uba.is2.common.mensaje.contenido.ContenidoDatoSuscripto;
import ar.uba.is2.common.mensaje.contenido.ContenidoSuscripcionDato;
import ar.uba.is2.common.mensaje.contenido.Identificador;
import ar.uba.is2.sc.config.Contexto;
import ar.uba.is2.sc.ecmanager.EcData;

public class ReceptorSuscripciones implements Receptor {
	
	private static final Logger logger = Logger.getLogger(ReceptorSuscripciones.class);

	@Override
	public void recibirMensaje(Mensaje mensaje) {
		
		switch (mensaje.getTipoMensaje()) {
		case SUSCRIBIRSE_A_DATO:
			recibirSuscripcionDato(mensaje);
			break;
		case DATOS_SUSCRIPTOS:
			recibirDatoSuscripto(mensaje);
		}
		
	}

	private void recibirDatoSuscripto(Mensaje mensaje) {

		ContenidoDatoSuscripto contenido = (ContenidoDatoSuscripto) mensaje.getContenido();
		Identificador identificador = contenido.getIdentificador();
		
		Collection<Componente> componentesSuscriptas = Suscripciones.instance.obtenerSuscriptos(identificador);
		
		if (componentesSuscriptas != null) {
			for (Componente componente : componentesSuscriptas) {
				Mensaje nuevoMensaje = redigiriMensaje(mensaje,componente); 
				Contexto.instance.getProtocolo().enviarMensaje(nuevoMensaje);
			}
			
		}
	}

	private Mensaje redigiriMensaje(Mensaje mensaje, Componente componente) {
		Mensaje msj = new Mensaje();
		
		msj.setOrigen(mensaje.getOrigen());
		msj.setDestino(componente);
		msj.setFechaCreacion(mensaje.getFechaCreacion());
		msj.setNumeroMensaje(Contexto.instance.getNroMensaje());
		msj.getCantidadPartes();
		msj.getParte();
		msj.setTipoMensaje(mensaje.getTipoMensaje());
		msj.setContenido(mensaje.getContenido());
		
		return msj;
	}

	private void recibirSuscripcionDato(Mensaje mensaje) {
		
		logger.info(String.format("Recibiendo suscripcion a %s", mensaje.getContenido().getContenido()));
		
		ContenidoSuscripcionDato contenido = (ContenidoSuscripcionDato) mensaje.getContenido();
		Identificador identificador = contenido.getContenido();
		
		Suscripciones.instance.agregarSuscripcion(identificador, mensaje.getOrigen());
		
		EcData ecData = Contexto.instance.getEstacionesCentrales().get(identificador.getCoordenada());
		
		if (ecData != null) {
			redigiriMensaje(mensaje, ecData.getComponenteEc());
		}
	}

}
